package pers.xiqingbo.dao.impl;

import pers.xiqingbo.dao.BaseDao;
import pers.xiqingbo.dao.BookDao;
import pers.xiqingbo.pojo.Book;
import pers.xiqingbo.pojo.Page;

import java.math.BigDecimal;
import java.util.List;

/**
 * @PackageName: pers.xiqingbo.dao.impl
 * @ClassName: BookDaoImpl
 * @Description: 图书管理数据访问层实现类
 * @Author: Schieber
 * @Date: 2021/2/18 下午 14:52
 */
public class BookDaoImpl extends BaseDao implements BookDao {
    Book book = new Book();

    /**
     * 添加图书信息接口
     *
     * @param book 添加的图书对象
     * @return 返回添加后影响的数据行数
     */
    @Override
    public int addBook(Book book) {
        String sql = "insert into t_book(`name`,`author`,`price`,`sales`,`stock`,`img_path`) values(?,?,?,?,?,?)";
        return update(sql, book.getName(), book.getAuthor(), book.getPrice(), book.getSales(), book.getStock(), book.getImgPath());
    }

    /**
     * 删除图书信息接口
     *
     * @param id 删除图书信息的id
     * @return 返回删除后影响的行数
     */
    @Override
    public int deleteBook(Integer id) {
        String sql = "delete from t_book where id = ?";
        return update(sql, id);
    }

    /**
     * 修改图书信息接口
     *
     * @param book 修改的图书对象
     * @return 返回修改后影响的行数
     */
    @Override
    public int updateBook(Book book) {
        String sql = "update t_book set `name`=?,`author`=?,`price`=?,`sales`=?,`stock`=?,`img_path`=? where id=?";
        return update(sql, book.getName(), book.getAuthor(), book.getPrice(), book.getSales(), book.getStock(), book.getImgPath(), book.getId());
    }

    /**
     * 通过id查询一个图书信息接口
     *
     * @param id 查询图书信息的id
     * @return 返回查询出的图书对象
     */
    @Override
    public Book queryBookById(Integer id) {
        String sql = "select `id`,`name`,`author`,`price`,`sales`,`stock`,`img_path` imgPath from t_book where id = ?";
        return queryForOne(Book.class, sql, id);
    }

    /**
     * 查询所有图书信息接口
     *
     * @return 所有查询出的图书信息集合
     */
    @Override
    public List<Book> queryBooks() {
        String sql = "select `id`,`name`,`author`,`price`,`sales`,`stock`,`img_path` imgPath from t_book";
        return queryForList(Book.class, sql);
    }

    /**
     * 查询图书总记录数
     *
     * @return 返回查询的记录数结果
     */
    @Override
    public Integer queryForPageTotalCount() {
        String sql = "select count(*) from t_book";
        Number totalNumber = (Number) queryForSingleValue(sql);
        return totalNumber.intValue();
    }

    /**
     * 分页查询后的图书列表信息
     *
     * @param begin    由第几条数据开始显示
     * @param pageSize 每页显示多少条数据
     * @return 返回分页查询出的图书列表
     */
    @Override
    public List<Book> queryForPageItems(int begin, int pageSize) {
        String sql = "select `id`,`name`,`author`,`price`,`sales`,`stock`,`img_path` imgPath from t_book limit ?,?";
        return queryForList(Book.class, sql, begin, pageSize);
    }

    /**
     * 通过价格区间查询图书总数量
     *
     * @param min 查询价格时的最小价格
     * @param max 查询价格时的最大价格
     * @return 返回通过价格区间查询后的图书总数量
     */
    @Override
    public Integer queryByPriceForCount(BigDecimal min, BigDecimal max) {
        String sql = "select count(*) from t_book where price between ? and ?";
        Number totalNumber = (Number) queryForSingleValue(sql, min, max);
        return totalNumber.intValue();
    }

    /**
     * 对通过价格查询后的图书进行分页
     *
     * @param min      查询价格时的最小价格
     * @param max      查询价格时的最大价格
     * @param pageNo   当前页码
     * @param pageSize 页面显示数据的数量
     * @return 返回通过价格分页后的图书对象
     */
    @Override
    public List<Book> pricePage(BigDecimal min, BigDecimal max, int pageNo, int pageSize) {
        String sql = "select `id`,`name`,`author`,`price`,`sales`,`stock`,`img_path` imgPath from t_book where price between ? and ? order by price limit ?,?";
        return queryForList(Book.class, sql, min, max, pageNo, pageSize);
    }

}
